package com.marktotop.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.marktotop.entity.system.Menu;
import com.marktotop.entity.system.Role;
import com.marktotop.entity.system.User;
import com.marktotop.error.SystemException;
import com.marktotop.response.ResultBean;
import com.marktotop.vo.system.UserContactVO;
import com.marktotop.vo.system.UserEditVO;
import com.marktotop.vo.system.UserInfoVO;
import com.marktotop.vo.system.UserVO;

import java.util.List;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author MarkToTop
 * @since 2021-07-12
 */
public interface IUserService extends IService<User> {


    /**
     * 用户登录
     *
     * @param username 用户名
     * @param password 密码
     * @return token
     * @throws SystemException
     */
    String login(String username, String password) throws SystemException;


    /**
     * 查询用户角色
     *
     * @param id 用户id
     * @return
     * @throws SystemException
     */
    List<Role> findRolesById(Long id) throws SystemException;


    /**
     * 根据用户角色查询用户的菜单
     * 菜单: menu+button
     *
     * @param roles 用户的角色
     * @return
     */
    List<Menu> findMenuByRoles(List<Role> roles);


    /**
     * 添加用户
     *
     * @param userVO
     * @return
     * @throws SystemException
     */
    boolean addUser(UserVO userVO) throws SystemException;

    /**
     * 查询用户信息
     * @return
     * @throws SystemException
     */
    UserInfoVO info() throws SystemException;

    /**
     * 分配角色
     *
     * @param id
     * @param rids
     * @return
     * @throws SystemException
     */
    boolean assignRoles(Long id, Long[] rids) throws SystemException;

    /**
     * 已拥有的角色ids
     *
     * @param id 用户id
     * @return
     * @throws SystemException
     */
    List<Long> roles(Long id) throws SystemException;

    /**
     * 更新用户状态
     *
     * @param id
     * @param status
     * @return
     * @throws SystemException
     */
    boolean updateStatus(Long id, Boolean status) throws SystemException;

    /**
     * 用户列表(分页展示)
     *
     * @param pageNum
     * @param pageSize
     * @param userVO
     * @return
     */
    ResultBean findUserList(Integer pageNum, Integer pageSize, UserVO userVO);

    /**
     * 根据id删除用户
     * @param id
     * @return
     * @throws SystemException
     */
    boolean deleteUser(Long id) throws SystemException;

    /**
     * 更新用户信息
     *
     * @param id
     * @param userEditVO
     * @return
     * @throws SystemException
     */
    boolean updateUser(Long id, UserEditVO userEditVO) throws SystemException;

    /**
     * 编辑用户
     *
     * @param id
     * @return
     * @throws SystemException
     */
    UserEditVO editUser(Long id) throws SystemException;


    /**
     * 判断要删除的部门是否存在用户
     *
     * @param id
     * @return
     */
    boolean findUserByDept(Long id);


    /**
     * 获取所有用户，作为联系人使用
     *
     * @return
     */
    List<UserContactVO> findUserForContact();


    /**
     * 获取所有用户信息
     *
     * @return
     * @throws SystemException
     */
    List<UserContactVO> selectAllUserContact() throws SystemException;

}
